package com.ecr.hub.service.mail.impl;

import java.io.File;
import java.io.FileNotFoundException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Resource;
import javax.mail.MessagingException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.ecr.hub.ApplicationException;
import com.ecr.hub.model.user.User;
import com.ecr.hub.service.mail.IHubMailSender;
import com.ecr.hub.service.mail.IMailManager;
import com.ecr.hub.util.LabelUtils;
import com.ecr.hub.util.ManagedBeanUtils;

@Component("mailManager")
public class MailManagerImpl implements IMailManager {

	// Propriété pour le répertoire de stockage des pdfs.
	@Value(value = "${pdf.directory.path}")
	private String pdfDirectoryPath;

	// Propriété pour destinataire du mail.
	@Value(value = "${mail.send.to}")
	private String mailTo;

	// Propriété pour le du mail.
	@Value(value = "${mail.send.from}")
	private String mailFrom;

	// Propriété pour activer l'envoi du mail.
	@Value(value = "${mail.send.active}")
	private String mailSend;

	// !! Attention au multi-thread !!
	DateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss-SSS");

	@Resource(name = "hubMailSender")
	IHubMailSender hubMailSender;

	@Override
	public void sendMultiPartMail(User user, String fileName)
			throws ApplicationException, FileNotFoundException,
			MessagingException {

		// On vérifie que l'envoi de mail est demandé.
		if (!"yes".equalsIgnoreCase(mailSend))
			return;

		String fullFilePath = ManagedBeanUtils.getRealPath(pdfDirectoryPath)
				+ File.separator + +user.getId() + File.separator + fileName;

		// On récupère le fichier pour le relevé de composition.
		File file = new File(fullFilePath);

		if (!file.exists())
			throw new FileNotFoundException(fullFilePath);

		String newFileName = LabelUtils.getLabel("mail.compo.filename");
		String mailSubject = LabelUtils.getLabel("mail.compo.subject");

		String newFullFilePath = ManagedBeanUtils.getRealPath(pdfDirectoryPath)
				+ File.separator + user.getId() + File.separator + newFileName
				+ df.format(new Date()) + ".pdf";

		// On renomme le fichier pour pouvoir l'envoyer.
		file.renameTo(new File(newFullFilePath));
		// On récupère le fichier.
		file = new File(newFullFilePath);

		// Vérifie que le fichier a bien été renomé.
		if (!file.exists())
			throw new FileNotFoundException(newFullFilePath);

		// Envoi du mail.
		hubMailSender.sendMail(mailTo, mailFrom, mailSubject, "",
				new String[] { file.getAbsolutePath() });

		// Suppression du fichier.
		file.delete();
	}
}
